/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : rc.hpp
  * Description        :
  ******************************************************************************
  * Function           :
  *
  ******************************************************************************
  * Author             : Zhiping Fu
  * Creation Date      : 2020年10月23日
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef __RC_HPP
#define __RC_HPP

#include "system/system.hpp"
#include "userlib/userlib.hpp"
#include "string.h"
#include "gpsMag/gpsMag.hpp"

#ifdef __cplusplus
extern "C" {
#endif


//#define RC_SBUS


#define RC_RX_LEN 300
#define RC_TX_LEN 30
#define PPM_NUM 27   //开头只有1个$，两个$的是28个
#define PWM_RC_NUM 8


#define RC_FUN_MIN			1450   //判别用，不是实际的
#define RC_FUN_MAX			1600
#define RC_PPM_MIN          1000   //实际
#define RC_PPM_MID          1500   //实际
#define RC_PPM_MAX          2000   //实际

#define RC_CHECK_NUM 500


void UART4_IRQHandler(void);
void DMA1_Stream2_IRQHandler(void);  //接收DMA中断


#ifdef __cplusplus
}
#endif


#ifdef __cplusplus

using namespace std;


class RC
{
public:
	RC(){}
	RC(USART_TypeDef * h,char * n) : huart(h),name(n){}
	~RC(){}

	void rc_Init(void);
	void rc_Update(void);
	void ControlRC_Check(void);

	HAL_LockTypeDef LockRx;
	bool  RxFlag;		//接收标志位
	uint16_t   RxDataSize;
	uint8_t RxRawDat[RC_RX_LEN];   //数据
	char RxDat[RC_RX_LEN];

	eRC rc_status;
	bool ever_rc;
	RC_Status_msg rc_status_msg;
private:
	USART_TypeDef * huart;
	char *name;

	uint32_t  startTimer;			//计时器
	uint32_t  stopTimer;			//计时器
	uint32_t  executionTime_us;			//计时器

	uint32_t  startTimerLast;			//计时器
	uint32_t  cycleTime_us;

	//用户数据
	bool  Update;		//更新  --
	eSTA  Sta;			//状态  --
	eERR  Err;			//错误信息  --
	u8    Pack;       //收包个数，1s
	eRC_MODE  Mode;   //行为模式
	sCNT ModeChk;

	u16  PPM[PWM_RC_NUM];
	float Val[4];     //roll pitch yaw high
	float Ang[2];     //遥控器角度 roll pitch
	float dAng;       //yaw角速度
	float Thr;        //遥控器油门
	float Uvw[3];     //遥控器Uvw
	float a,b,c;      //油门2次曲线
	s16   HIG_THR;    //油门高位点
	s16   MID_THR;    //油门中位点
	s16   LOW_THR;    //油门低位点
	u8    Key[4];     //4个开关

	bool rc_buffer[RC_CHECK_NUM];
	u16 rc_cnt;
	u16 rc_check;

	RCData rc_ppm;
	RC_command_msg rcCommand;

};

extern RC rc;

#endif

#endif


/************************ (C) COPYRIGHT Longmen Drone Team *****END OF FILE****/
